import router from "@/router/index";
import { useAppStore } from "@/stores/app";
import { notFoundRoute, mistakeRoute } from "./constants";
// 引入进度条插件以及样式
import NProgress from "nprogress";
import "nprogress/nprogress.css";
NProgress.configure({
  easing: "ease",
  speed: 900,
  showSpinner: false,
});

// 配置白名单页面
const whitelist = ["/login"];

// 路由守卫
router.beforeEach(async (to, from, next) => {
  const store = useAppStore(); // 放在外面pinia会报错
  const token = localStorage.getItem("token"); // token要放在里面否则会有异步问题
  const userInfo = localStorage.getItem("userInfo");
  if (!whitelist.includes(to.path)) {
    if (!token) {
      // 没有token访问非白名单直接重定向登录页
      next("/login");
    } else {
      // 有token后用动态路由做权限管理
      if (store.isAddRoutes) {
        // 是否有动态添加 就是下面的代码是否走过一遍了 走过了就不用走了防止死循环
        next();
      } else {
        // 异步数据，要用awaite等待执行结果，否则直接走后面会报错
        const permissionRoutes = await store.getPermissionRoutes(
          userInfo as string // 有token了这里就不可能是null了 断言成字符串就可以
        );
        console.log(permissionRoutes, "权限路由");
        permissionRoutes.forEach((item: any) => {
          router.addRoute(item); // 逐条添加路由记录
        });
        // 最后动态添加404页面
        router.addRoute(notFoundRoute);
        router.addRoute(mistakeRoute);
        store.isAddRoutes = true;
        next(to.fullPath);
      }
    }
  } else {
    next();
  }
  NProgress.start(); // 开启进度条
});

router.afterEach((to) => {
  document.title = to.meta.title as string; // 设置浏览器tab选项卡标题
  NProgress.done(); // 关闭进度条
});
